using System;
using System.Collections.Generic;
using System.Text;
using TAC;
using CenterSpace.Free;

namespace Arena
{
	class MapaReal
	{
		private Mapa mapa;
		public readonly List<NonPlayerCharacter> personagens;

		public MapaReal(int numeroNPC, int pontosBase)
		{
			mapa = new Mapa();
			personagens = new List<NonPlayerCharacter>();

			atribuicaoAtributos(numeroNPC, pontosBase);

			colocarAleatoriamente();
		}

        public List<NonPlayerCharacter> pegarPersonagens()
		{
			return personagens;
		}

        public void imprimir()
        {
            mapa.imprimir();
        }

        public int getX()
        {
            return mapa.getX();
        }

        public int getY()
        {
            return mapa.getY();
        }

        public String pegarMapa()
        {
            return mapa.pegarMapa();
        }

        public bool pontoValido(int x, int y)
        {
            return mapa.posicaoValida(x, y);
        }

        public bool pontoCorreto(int x, int y)
        {
            return mapa.posicaoCorreta(x, y);
        }

		private void atribuicaoAtributos(int numeroNPC, int pontosBase)
		{
			int[] temporario;
			for (int i = 0; i < numeroNPC; i++)
			{
				if (i == 0)
				{
                    personagens.Add(FabricaNPC.Instancia().criarNPC(pontosBase));
                    Console.WriteLine((i+1) + ": " + personagens[i].getAttribute(0) + " " + personagens[i].getAttribute(1) + " " + personagens[i].getAttribute(2) + " " + personagens[i].getAttribute(3));
				}
				else
				{
					temporario = new int[] {personagens[i - 1].getAttribute(0), personagens[i - 1].getAttribute(1), personagens[i - 1].getAttribute(2), personagens[i - 1].getAttribute(3)};
					personagens.Add(FabricaNPC.Instancia().criarNPC (pontosBase, temporario));
                    Console.WriteLine((i+1) + ": " + personagens[i].getAttribute(0) + " " + personagens[i].getAttribute(1) + " " + personagens[i].getAttribute(2) + " " + personagens[i].getAttribute(3));
                }
			}
		}

		private void colocarAleatoriamente()
		{
            MersenneTwister random = new MersenneTwister(DateTime.Now.Millisecond + GeradorPNJ.a);
			for (int i = 0; i < personagens.Count; i++)
			{
				int x = random.Next(mapa.getX()-1);
				int y = random.Next(mapa.getY()-1);

				if (mapa.posicaoValida(x, y))
				{
					mapa.setOcupado(true, x, y);
					personagens[i].setX(x);
					personagens[i].setY(y);
				}
				else if (y < mapa.getY()-1 && mapa.posicaoValida(x, y+1))
				{
					mapa.setOcupado(true, x, y+1);
					personagens[i].setX(x);
					personagens[i].setY(y+1);
				}
				else if (y > 0 && mapa.posicaoValida(x, y - 1))
				{
					mapa.setOcupado(true, x, y - 1);
					personagens[i].setX(x);
					personagens[i].setY(y - 1);
				}
				else if (x < mapa.getX() - 1 && mapa.posicaoValida(x + 1, y))
				{
					mapa.setOcupado(true, x + 1, y);
					personagens[i].setX(x + 1);
					personagens[i].setY(y);
				}
                else if (x > 0 && mapa.posicaoValida(x - 1, y))
                {
                    mapa.setOcupado(true, x - 1, y);
                    personagens[i].setX(x - 1);
                    personagens[i].setY(y);
                }
                else if (i > 0)
                {
                    i--;
                }
			}
		}

		public bool adjacente(Character a, Character b)
		{
			return ((a.getX() == b.getX() && a.getY() == b.getY() - 1) || (a.getX() == b.getX() - 1 && a.getY() == b.getY() - 1)
				 || (a.getX() == b.getX() - 1 && a.getY() == b.getY()) || (a.getX() == b.getX() + 1 && a.getY() == b.getY() - 1)
				 || (a.getX() == b.getX() && a.getY() == b.getY() + 1) || (a.getX() == b.getX() + 1 && a.getY() == b.getY() + 1)
				 || (a.getX() == b.getX() + 1 && a.getY() == b.getY()) || (a.getX() == b.getX() - 1 && a.getY() == b.getY() + 1)
				 || (b.getX() == a.getX() && b.getY() == a.getY() - 1) || (b.getX() == a.getX() - 1 && b.getY() == a.getY() - 1)
				 || (b.getX() == a.getX() - 1 && b.getY() == a.getY()) || (b.getX() == a.getX() + 1 && b.getY() == a.getY() - 1)
				 || (b.getX() == a.getX() && b.getY() == a.getY() + 1) || (b.getX() == a.getX() + 1 && b.getY() == a.getY() + 1)
				 || (b.getX() == a.getX() + 1 && b.getY() == a.getY()) || (b.getX() == a.getX() - 1 && b.getY() == a.getY() + 1));
		}
	}
}
